#include <cstdlib>
#include "Caja.h"

//Inicializo los miembros estaticos
int Caja :: numeroCiclo = 0;
int Caja :: tiempoMaximoDeAtencion = 1;

Caja :: Caja(){
    tiempoDeAtencionClienteActual = 0;
    colaClientes.limpiar();
    cantCli = 0;
    cantCliTotal = 0;
    tiempoDeEsperaTotal = 0;
    tiempoDeOcioTotal = 0;
}

void Caja :: encolarCliente( const Cliente &cli ){
    colaClientes.encolar( cli );
    cantCli++;
    
    /*Si es el primer cliente despues de un ciclo de ocio, no tiene tiempo de
    espera y lo empiezo a atender de inmediato, para esto le asigno un tiempo de
    atencion entre 1 y X*/
    if( cantCli == 1 )
        tiempoDeAtencionClienteActual = (rand() % tiempoMaximoDeAtencion) + 1;
    
}

void Caja :: nuevoCiclo(){
    
    if( cantCli > 0 ){
        
        //Ya paso un ciclo, asi que le resto 1 al tiempo de atencion del cliente actual
        tiempoDeAtencionClienteActual--;
        
        if( tiempoDeAtencionClienteActual == 0 ){
            
            /*Si lo termino de atender lo desencolo y le resto 1 a la
            cantidad de clientes que tengo en cola*/
            colaClientes.desencolar();
            cantCli--;
            
            //Sumo 1 a la cantidad total de clientes atendidos
            cantCliTotal++;
            
            //Si hay mas clientes, sigo atendiendo
            if( cantCli > 0 ){
                //Sumo el tiempo que espera este cliente al tiempo de espera total
                tiempoDeEsperaTotal += numeroCiclo - colaClientes.getPrimero().getCicloEntrada();
                //Le asigno un tiempo de atención entre 1 y X
                tiempoDeAtencionClienteActual = (rand() % tiempoMaximoDeAtencion) + 1;
                               
            }
            
        }
    //Si no hay clientes, tengo tiempo de ocio
    }else tiempoDeOcioTotal++;
    
}

bool Caja :: operator < ( const Caja & C ) const{
    return cantCli < C.cantCli;
}

int Caja :: getCantCli(){
    return cantCli;
}
        
float Caja :: getTiempoDeEsperaPromedio(){
    return cantCliTotal > 0 ? (float) tiempoDeEsperaTotal / (float) cantCliTotal : 0;
}
        
int Caja :: getTiempoDeOcioTotal(){
    return tiempoDeOcioTotal;
}

